﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

/*
 场景题 4：游戏设置管理
 场景描述：
     你的游戏应用需要一个全局的游戏设置管理器，负责存储和管理游戏的各种设置（如音量、屏幕分辨率等）。该设置管理器应该是一个单例，以确保所有游戏场景和模块都使用相同的设置。
 练习要求：
     实现一个单例模式的游戏设置管理器类。
     提供方法来设置和获取游戏设置。
     确保游戏设置管理器在整个应用程序中只有一个实例。
 */
namespace CS_BEGINNER_TO_PROFICIENT.DesignPatterns.CreationMode.SingletonPattern.Practice
{
    public class GameSettings
    {
        private static readonly Lazy<GameSettings> _instance = new Lazy<GameSettings>(() => new GameSettings());
        private readonly string _settingsFilePath;
        public int Volume { get; set; }
        public Resolution ScreenResolution { get; set; }

        private GameSettings()
        {
            _settingsFilePath = @"./../../DesignPatterns/CreationMode/SingletonPattern/Practice/settings.json";
            LoadSettings();
        }

        public static GameSettings Instance => _instance.Value;

        private void LoadSettings()
        {
            if (File.Exists(_settingsFilePath))
            {
                var json = File.ReadAllText(_settingsFilePath);
                var settingsDto = JsonConvert.DeserializeObject<SettingsDto>(json);
                if (settingsDto != null)
                {
                    Volume = settingsDto.Volume;
                    ScreenResolution = new Resolution
                    {
                        Width = settingsDto.ScreenResolution.Width,
                        Height = settingsDto.ScreenResolution.Height
                    };
                }
            }
            else
            {
                Volume = 50;
                ScreenResolution = new Resolution { Width = 1920, Height = 1000 };
            }
        }

        public void SaveSettings()
        {
            var json = JsonConvert.SerializeObject(this, Formatting.Indented);
            File.WriteAllText(_settingsFilePath, json);
        }
    }

    public class Resolution
    {
        public int Width { get; set; }
        public int Height { get; set; }
    }

    public class SettingsDto
    {
        public int Volume { get; set; }
        public Resolution ScreenResolution { get; set; }
    }
}
